Docker

您所在的位置:网站首页 ubuntu1804 ip地址配置 Docker

Docker

2023-03-19 13:08| 来源: 网络整理| 查看: 265

1 Docker 介绍和基础操作

Container 即容器,平时生活中指的是可以装下其它物品的工具, 以方便人类归纳放置物品 、存储和 异地运输 ,比如人类使用的衣柜 、行李箱、 背包等可以成为容器,Container 除了容器以外,另一个 意思是集装箱, 很多码头工人将很多装有不同物品但却整齐划一的箱子装载到停靠在岸边大船,然后方 便的运来运去。 为什么这些集装箱可以很方便的运来运去呢?因为它们大小一致标准化尺寸的箱子,并且可以安全的隔 离开,所以当我们使用 Container 来形容容器的时候,就是我们想要让容器达到一个可以打包,符合标 准的状态。 但今天我们所说的容器是一种 IT 技术。容器其实是一种沙盒技术。顾名思义,沙盒就是能够像一个集 装箱一样,把你的应用装起来。这样,应用与应用之间就有了边界而不会相互干扰;同时装在沙盒里面的 应用,也可以很方便的被搬来搬去,这也是 PaaS 想要的最理想的状态(可移植性,标准化,隔离性)。 容器是软件工业上的集装箱的技术,集装箱的标准化,减少了包装成本,大大提高货物运输和装卸效 率,是传统运输行业的重大变革。早期的软件项目中软件更新,发布低效,开发测试发布周期很长,很 难敏捷。有了容器技术,就可以利用其标准化的特点,大幅提高生产效率。 容器技术是虚拟化、云计算、大数据之后的一门新兴的并且是炙手可热的新技术, 容器技术提高了硬件 资源利用率、 方便了企业的业务快速横向扩容(可以达到秒级快速扩容)、 实现了业务宕机自愈功能 (配合K8S可以实现,但OpenStack无此功能),因此未来数年会是一个容器愈发流行

## 1.1 Docker 介绍 ### 1.1.1 容器历史 ```bash 虽然 docker 把容器技术推向了巅峰,但容器技术却不是从 docker 诞生的。实际上,容器技术连新技 术都算不上,因为它的诞生和使用确实有些年头了。下面的一串名称可能有的你都没有听说过,但它们 的确都是容器技术的应用: 1、Chroot Jail 就是我们常见的 chroot 命令的用法。它在 1979 年的时候就出现了,被认为是最早的容器化技术之 一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail Freebsd Jail (监狱)实现了操作系统级别的虚拟化,它是操作系统级别虚拟化技术的先驱之一。2000 年,伴随FreeBSD4.0版的发布 3、Linux VServer 使用添加到 Linux 内核的系统级别的虚拟化功能实现的专用虚拟服务器。允许创建许多独立的虚拟专用 服务器,这些虚拟专用服务器在单个物理服务器上全速同时运行,从而有效地共享硬件资源。 提供与传统Linux服务器几乎相同的操作环境。可以在这样的服务器上启动所有服务(例如ssh,邮 件,Web和数据库服务器),而无需(或者在特殊情况下只需进行很少的修改),就像在任何真实服务 器上一样。 每个服务器都有自己的用户帐户数据库和root密码,并且与其他虚拟服务器隔离,但它们共享相同的硬件 资源 2003年11月1日 VServer 1.0 发布 官网:http://linux-vserver.org/ 4、Solaris Containers 它也是操作系统级别的虚拟化技术,专为 X86 和 SPARC 系统设计。Solaris 容器是系统资源控制和通过 "区域" 提供边界隔离的组合。 5、OpenVZ OpenVZ 是一种 Linux 中操作系统级别的虚拟化技术。 它允许创建多个安全隔离的 Linux 容器,即 。 6、Process Containers Process 容器由 Google 的工程师开发,一般被称为 cgroups。 7、LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令 解释机制以及全虚拟化的其他复杂性。容器有效地将由单个操作系统管理的资源划分到孤立的组中,以 更好地在孤立的组之间平衡有冲突的资源使用需求 Linux Container提供了在单一可控主机节点上支持多个相互隔离的server container同时执行的机制。 Linux Container有点像chroot,提供了一个拥有自己进程和网络空间的虚拟环境,但又有别于虚拟 机,因为lxc是一种操作系统层次上的资源的虚拟化。 8、Warden 在最初阶段,Warden 使用 LXC 作为容器运行时。 如今已被 CloudFoundy 取代。 9、LMCTFY LMCTY 是 Let me contain that for you 的缩写。它是 Google 的容器技术栈的开源版本。 Google 的工程师一直在与 docker 的 libertainer 团队合作,并将 libertainer 的核心概念进行抽象并移 植到此项目中。该项目的进展不明,估计会被 libcontainer 取代。 10、Docker Docker 是一个可以将应用程序及其依赖打包到几乎可以在任何服务器上运行的容器的工具。 11、RKT RKT 是 Rocket 的缩写,它是一个专注于安全和开放标准的应用程序容器引擎。 综上所述正如我们所看到的,docker 并不是第一个容器化技术,但它的确是最知名的一个。 1.1.2 Docker 是什么 Docker (码头工人)是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司(后由于 Docker 开 源后大受欢迎就将公司改名为 Docker Inc ,总部位于美国加州的旧金山)内部的一个开源的 PAAS 服 务 (Platform as a ServiceService )的业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加 入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护。 Docker 是基于 linux 内核实现,Docker 最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可 以提供轻量级的虚拟化 ,可以说 docker 就是基于 LXC 发展起来 的,提供 LXC 的高级封装,标准的配 置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernel- based Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行 容器,彻底抛弃了LXC。 Docker 相比虚拟机的交付速度更快,资源消耗更低,Docker 采用客户端/服务端架构,使用远程API来 管理和创建容器,其可以轻松的创建一个轻量级的、可移植的、自给自足的容器,docker 的三大理念 是build(构建)、ship(运输)、 run(运行),Docker遵从apache 2.0协议,并通过(namespace及cgroup 等)来提供容器的资源隔离与安全保障等,所以Docke容器在运行时不需要类似虚拟机(空运行的虚拟 机占用物理机6-8%性能)的额外资源开销,因此可以大幅提高资源利用率,总而言之Docker是一种用了 新颖方式实现的轻量级虚拟机.类似于VM但是在原理和应用上和VM的差别还是很大的,并且docker的 专业叫法是应用容器(Application Container)。 Docker的主要目标 Build, Ship and Run Any App, Anywhere,即通过对应用组件的封装(Packaging)、分发 (Distribution)、部署(Deployment)、运行(Runtime)等生命周期的管理,达到应用组件级别的 “一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是 一个操作系统。将应用运行在Docker 容器上,可以实现跨平台,跨服务器,只需一次配置准备好相关 的应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问 题,从而极大提升了部署效率,减少故障的可能性 使用Docker 容器化封装应用程序的意义 统一基础设施环境-docker环境 硬件的组成配置 操作系统的版本 运行时环境的异构 统一程序打包(装箱)方式-docker镜像 java程序 python程序 nodejs程序 统一程序部署(运行)方式-docker容器 java-jar...→ docker run... python manage.py runserver... → docker run... npm run dev ... → docker run... 1.1.3 Docker 和虚拟机,物理主机 容器和虚拟机技术比较 传统虚拟机是虚拟出个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软 件 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化 每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用 户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响 容器和虚拟机表现比较 资源利用率更高: 开销更小,不需要启动单独的虚拟机OS内核占用硬件资源,可以将服务器性能压榨 至极致.虚拟机一般会有5-20%的损耗,容器运行基本无损耗,所以生产中一台物理机只能运行数十个 虚拟机,但是一般可以运行数百个容器 启动速度更快: 可以在数秒内完成启动 占用空间更小: 容器一般占用的磁盘空间以MB为单位,而虚拟机以GB 集成性更好: 和CI/CD(持续集成/持续部署)相关技术结合性更好,实现打包镜像发布测试可以一 键运行,做到自动化并快速的部署管理,实现高效的开发生命周期 使用虚拟机是为了更好的实现服务运行环境隔离,每个虚拟机都有独立的内核,虚拟化可以实现不同操 作系统的虚拟机,但是通常一个虚拟机只运行一个服务,很明显资源利用率比较低且造成不必要的性能 损耗,我们创建虚拟机的目的是为了运行应用程序,比如Nginx、PHP、Tomcat等web程序,使用虚拟 机无疑带来了一些不必要的资源开销,但是容器技术则基于减少中间运行环节带来较大的性能提升。 根据实验,一个运行着CentOS的KVM虚拟机启动后,在不做优化的情况下,虚拟机自己就需要占用 100~200 MB内存。此外,用户应用运行在虚拟机里面,它对宿主机操作系统的调用就不可避免地要经 过虚拟化软件的拦截和处理,这本身又是一层性能损耗,尤其对计算资源、网络和磁盘I/O的损耗非常 大。 比如: 一台96G内存的物理服务器,为了运行java程序的虚拟机一般需要分配8G内存/4核的资源,只能 运行13台左右虚拟机,但是改为在doker容器上运行Java程序,每个容器只需要分配4G内存即可,同样 的物理服务器就可以运行25个左右容器,运行数量相当于提高一倍,可以大幅节省IT支出,通常情况下 至少可节约一半以上的物理设备 1.1.4 Docker 的组成 docker 官网: http://www.docker.com 帮助文档链接: https://docs.docker.com/ docker 镜像: https://hub.docker.com/ docker 中文网站: http://www.docker.org.cn/ Docker 主机(Host): 一个物理机或虚拟机,用于运行Docker服务进程和容器,也称为宿主机, node节点 Docker 服务端(Server): Docker守护进程,运行docker容器 Docker 客户端(Client): 客户端使用 docker 命令或其他工具调用docker API Docker 镜像(Images): 镜像可以理解为创建实例使用的模板,本质上就是一些程序文件的集合 Docker 仓库(Registry): 保存镜像的仓库,官方仓库: https://hub.docker.com/,可以搭建私有仓 库harbor Docker 容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务,其本质就是将镜像中 的程序启动后生成的进程

例如将centos 的镜像放在网站上面。拉取该镜像就可以使用了 image.png

image.png

1.1.5 Namespace

image.png

一个宿主机运行了N个容器,多个容器共用一个 OS,必然带来的以下问题: 怎么样保证每个容器都有不同的文件系统并且能互不影响? 一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进 程?各个容器子进程间能相互通信(内存数据)吗? 每个容器怎么解决IP及端口分配的问题? 多个容器的主机名能一样吗? 每个容器都要不要有root用户?怎么解决账户重名问题? namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各 个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主 机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程 内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统 空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离: 1.1.5.1 MNT Namespace 每个容器都要有独立的根文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行 环境,即一个宿主机是ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面 启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里 面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。 例如: /var/lib/containerd/io.containerd.runtime.v1.linux/moby/容器ID 根目录: /var/lib/docker/overlay2/ID 范例: #启动三个容器用于以下验证过程: [root@ubuntu1804 ~]#docker version Client: Docker Engine - Community Version: 19.03.5 API version: 1.40 Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:29:52 2019 OS/Arch: linux/amd64 Experimental: false Server: Docker Engine - Community Engine: Version: 19.03.5 API version: 1.40 (minimum version 1.12) Go version: go1.12.12 Git commit: 633a0ea838 Built: Wed Nov 13 07:28:22 2019 OS/Arch: linux/amd64 Experimental: false containerd: Version: 1.2.10 GitCommit: b34a5c8af56e510852c35414db4c1f4fa6172339 runc: Version: 1.0.0-rc8+dev GitCommit: 3e425f80a8c931f88e6d94a8c831b9d5aa481657 docker-init: Version: 0.18.0 GitCommit: fec3683 [root@ubuntu1804 ~]# docker run -d --name nginx-1 -p 80:80 nginx [root@ubuntu1804 ~]# docker run -d --name nginx-2 -p 81:80 nginx [root@ubuntu1804 ~]# docker run -d --name nginx-3 -p 82:80 nginx 范例: 查看存储 [root@ubuntu1804 ~]#docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d2d79c1d3695 centos:centos8.1.1911 "/bin/bash" 14 minutes ago Up 14 minutes boring_carson 17ff44b1dbff centos:centos8.1.1911 "/bin/bash" 17 minutes ago Up 17 minutes interesting_austin [root@ubuntu1804 ~]#ls /var/lib/containerd/io.containerd.runtime.v1.linux/moby/ 17ff44b1dbff94e3578b3d3b74daae54527c1f65a279bb07f00641bda24ba580 d2d79c1d36954642dbab35e19bf75075dc94b66c11626c72ac52910add710204 [root@ubuntu1804 ~]#ls /var/lib/docker/overlay2/0c45e9ac63195a4562a1b5fcd4089a2ad604418d381557e7c1165da 70263b75b/merged/ bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var 范例: 验证容器的根文件系统 [root@centos8 ~]#podman exec nginx cat /etc/issue Debian GNU/Linux 9 \n \l [root@centos8 ~]#podman exec nginx ls / bin boot data dev etc home lib lib64 media mnt opt proc root

image.png

image.png image.png image.png image.png

1.1.5.6 User Namespace

各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器 内的用户空间呢? User Namespace允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID, 只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是 此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离、互不影响、永不相见。 image.png

1.1.6 Control groups Linux Cgroups的全称是Linux Control Groups,是Linux内核的一个功能.最早是由Google的工程师(主 要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在 2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命 名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。 如果不对一个容器做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug 程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资 源分配限制,比如CPU、内存等 [root@ubuntu1804 ~]#grep CGROUP /boot/config-4.15.0-29-generic CONFIG_CGROUPS=y CONFIG_BLK_CGROUP=y # CONFIG_DEBUG_BLK_CGROUP is not set CONFIG_CGROUP_WRITEBACK=y CONFIG_CGROUP_SCHED=y CONFIG_CGROUP_PIDS=y CONFIG_CGROUP_RDMA=y CONFIG_CGROUP_FREEZER=y CONFIG_CGROUP_HUGETLB=y CONFIG_CGROUP_DEVICE=y CONFIG_CGROUP_CPUACCT=y CONFIG_CGROUP_PERF=y CONFIG_CGROUP_BPF=y # CONFIG_CGROUP_DEBUG is not set CONFIG_SOCK_CGROUP_DATA=y CONFIG_NETFILTER_XT_MATCH_CGROUP=m CONFIG_NET_CLS_CGROUP=m CONFIG_CGROUP_NET_PRIO=y CONFIG_CGROUP_NET_CLASSID=y cgroups 中内存模块: [root@ubuntu1804 ~]#grep MEMCG /boot/config-4.15.0-29-generic CONFIG_MEMCG=y CONFIG_MEMCG_SWAP=y # CONFIG_MEMCG_SWAP_ENABLED is not set CONFIG_SLUB_MEMCG_SYSFS_ON=y 1.1.6.2 cgroups 具体实现

blkio: 块设备IO限制 cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问 cpuacct: 产生 cgroup 任务的 cpu 资源报告 cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存 devices: 允许或拒绝 cgroup 任务对设备的访问 freezer: 暂停和恢复 cgroup 任务 memory: 设置每个 cgroup 的内存限制以及产生内存资源报告 net_cls: 标记每个网络包以供 cgroup 方便使用 ns: 命名空间子系统 perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程 以及运行在特定CPU上的线程

#### 1.1.6.3 查看系统 cgroups ```bash [root@ubuntu1804 ~]#ll /sys/fs/cgroup/ total 0 drwxr-xr-x 15 root root 380 Jan 22 16:20 ./ drwxr-xr-x 10 root root 0 Jan 22 16:20 ../ dr-xr-xr-x 5 root root 0 Jan 22 16:20 blkio/ lrwxrwxrwx 1 root root 11 Jan 22 16:20 cpu -> cpu,cpuacct/ lrwxrwxrwx 1 root root 11 Jan 22 16:20 cpuacct -> cpu,cpuacct/ dr-xr-xr-x 5 root root 0 Jan 22 16:20 cpu,cpuacct/ dr-xr-xr-x 3 root root 0 Jan 22 16:20 cpuset/ dr-xr-xr-x 5 root root 0 Jan 22 16:20 devices/ dr-xr-xr-x 3 root root 0 Jan 22 16:20 freezer/ dr-xr-xr-x 3 root root 0 Jan 22 16:20 hugetlb/ dr-xr-xr-x 5 root root 0 Jan 22 16:20 memory/ lrwxrwxrwx 1 root root 16 Jan 22 16:20 net_cls -> net_cls,net_prio/ dr-xr-xr-x 3 root root 0 Jan 22 16:20 net_cls,net_prio/ lrwxrwxrwx 1 root root 16 Jan 22 16:20 net_prio -> net_cls,net_prio/ dr-xr-xr-x 3 root root 0 Jan 22 16:20 perf_event/ dr-xr-xr-x 5 root root 0 Jan 22 16:20 pids/ dr-xr-xr-x 2 root root 0 Jan 22 16:20 rdma/ dr-xr-xr-x 6 root root 0 Jan 22 16:20 systemd/ dr-xr-xr-x 5 root root 0 Jan 22 16:20 unified/ [root@ubuntu1804 ~]#cat /sys/fs/cgroup/cpu/docker/5dee9be9afdbab8c2f6c4c5eb0f956c9579efe93110daf638f8fd1 5f43d961e2/cpuacct.usage 4751336886 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/5dee9be9afdbab8c2f6c4c5eb0f956c9579efe93110daf638f8 fd15f43d961e2/cpuacct.usage cat: /sys/fs/cgroup/memory/docker/5dee9be9afdbab8c2f6c4c5eb0f956c9579efe93110daf638f8 fd15f43d961e2/cpuacct.usage: No such file or directory [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/5dee9be9afdbab8c2f6c4c5eb0f956c9579efe93110daf638f8 fd15f43d961e2/memory.limit_in_bytes 9223372036854771712 [root@ubuntu1804 ~]#cat /sys/fs/cgroup/memory/docker/5dee9be9afdbab8c2f6c4c5eb0f956c9579efe93110daf638f8 fd15f43d961e2/memory.max_usage_in_bytes 79278080 1.1.7 容器管理工具

有了以上的chroot、namespace、cgroups就具备了基础的容器运行环境,但是还需要有相应的容器创建与删除的管理工具、以及怎么样把容器运行起来、容器数据怎么处理、怎么进行启动与关闭等问题需要解决,于是容器管理技术出现了。目前主要是使用docker,早期使用 LXC

1.1.7.1 LXC

LXC: Linux Container。可以提供轻量级的虚拟化功能,以便隔离进程和资源,包括一系列容器的管理工 具软件,如,lxc-create,lxc-start,lxc-attach等,但这技术功能不完善,目前较少使用 官方网站: https://linuxcontainers.org/ 案例: Ubuntu安装 和使用 LXC

[root@ubuntu1804 ~]#apt install lxc lxd Reading package lists... Done Building dependency tree Reading state information... Done lxd is already the newest version (3.0.3-0ubuntu1~18.04.1). lxc is already the newest version (3.0.3-0ubuntu1~18.04.1). ...... 1.1.7.3 pouch (阿里内部开发的,阿里内部使用)

项目网点: https://github.com/alibaba/pouch Pouch (小袋子)起源于 2011 年,并于2017年11月19日上午,在中国开源年会现场,阿里巴巴正式 开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可 移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中 心的物理资源利用率 目前的容器方案大多基于 Linux 内核提供的 cgroup 和 namespace 来实现隔离,然后这样轻量级方案 存在弊端: 容器间,容器与宿主间,共享同一个内核 内核实现的隔离资源,维度不足 面对如此的内核现状,阿里巴巴采取了三个方面的工作,来解决容器的安全问题: 用户态增强容器的隔离维度,比如网络带宽、磁盘使用量等 给内核提交 patch,修复容器的资源可见性问题,cgroup 方面的 bug 实现基于 Hypervisor 的容器,通过创建新内核来实现容器隔离

1.1.7.4 Podman

然目前 Docker 是管理 Linux 容器最好的工具,注意没有之一,但是podman的横空出现即将改变这 一点 什么是Podman? Podman即Pod Manager tool,从名称上可以看出和kubernets的pod的密切联系,不过就其功能来 说,简而言之: alias docker = podman,是CentOS 8 新集成的功能,或许不久的未来会代替docker Podman是一个 为 Kubernetes 而生的开源的容器管理工具,原来是 CRI-O(即容器运行时接口CRI 和 开放容器计划OCI) 项目的一部分,后来被分离成一个单独的项目叫 libpod。其可在大多数Linux平台 上使用,它是一种无守护程序的容器引擎,用于在Linux系统上开发,管理和运行任何符合Open Container Initiative(OCI)标准的容器和容器镜像。 Podman 提供了一个与Docker兼容的命令行前端,Podman 里面87%的指令都和Docker CLI 相同,因 此可以简单地为Docker CLI别名,即“ alias docker = podman”,事实上,podman使用的一些库也是 docker的一部分。

官网地址: https://podman.io/ 项目地址: https://github.com/containers/libpod

Podman 和docker不同之处 docker 需要在系统上运行一个守护进程(docker daemon),这会产生一定的开销,而podman 不 需要 启动容器的方式不同: docker cli 命令通过API跟 Docker Engine(引擎)交互告诉它我想创建一个container,然后 docker Engine才会调用 OCI container runtime(runc)来启动一个container。这代表 container的process(进程)不会是 Docker CLI的 child process(子进程),而是 Docker Engine的 child process。 Podman是直接给 OCI containner runtime(runc)进行交互来创建container的,所以 container process直接是 podman的 child process。 因为docke有docker daemon,所以docker启动的容器支持 --restart策略,但是podman不支 持 docker需要使用root用户来创建容器。 这可能会产生安全风险,尤其是当用户知道docker run命 令的--privileged选项时。podman既可以由root用户运行,也可以由非特权用户运行 docker在Linux上作为守护进程运行扼杀了容器社区的创新。 如果要更改容器的工作方式,则需要 更改docker守护程序并将这些更改推送到上游。 没有守护进程,容器基础结构更加模块化,更容 易进行更改。 podman的无守护进程架构更加灵活和安全。

1.1.8 Docker 的优势

快速部署: 短时间内可以部署成百上千个应用,更快速交付到线上 高效虚拟化: 不需要额外hypervisor支持,基于linux内核实现应用虚拟化,相比虚拟机大幅提高性能和效率 节省开支: 提高服务器利用率,降低IT支出 简化配置: 将运行环境打包保存至容器,使用时直接启动即可 环境统一: 将开发,测试,生产的应用运行环境进行标准化和统一,减少环境不一样带来的各种问题 快速迁移和扩展: 可实现跨平台运行在物理机、虚拟机、公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至是A平台迁移到B平台更好的实现面向服务的架构,推荐一个容器只运行一个应用,实现分布的应用模型,可以方便的进行横向扩展,符合开发中高内聚,低耦合的要求,减少不同服务之间的相互影响

### 1.1.9 Docker 的缺点 多个容器共用宿主机的内核,各应用之间的隔离不如虚拟机彻底 由于和宿主机之间的进程也是隔离的,需要进入容器查看和调试容器内进程等资源,变得比较困难和繁琐 如果容器内进程需要查看和调试,需要在每个容器内都需要安装相应的工具,这也造成存储空间的重 复浪费


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3